(function(){

    // 定义一个Animal类
    class Animal {
        name: string;
        age: number;
        constructor(name: string, age: number) {
            this.name = name;
            this.age = age;
        }
        sayHello() {
            console.log(this.name + '在叫');
        }
    }

    /**
     * Dog extends Animal
     *  - 此时，Dog是Animal的子类，Animal是Dog的父类
     *  - 使用继承后，子类将会拥有父类所有的属性和方法
     *  - 通过继承可以将多个类中共有的代码写在一个父类中
     *     - 这样只需要写一次即可让所有的子类都拥有这个方法
     *     - 如果希望在子类中添加一些父类中没有的属性或方法直接加就可以
     *  - 如果在子类中添加了和父类相同的方法，则子类的方法会覆盖掉父类的方法
     *     - 这种子类覆盖掉父类方法的形式，我们称为方法的重写
     * */ 
    // 定义一个Dog类，继承自Animal
    class Dog extends Animal {
        // 定义子类自己的属性
        run() {
            console.log(this.name + '在跑');
        }
    }

    class Cat extends Animal {}


    const dog = new Dog('旺财', 5);
    console.log(dog);
    dog.sayHello();
    dog.run();

    const cat = new Cat('咪咪', 3);
    console.log(cat);
    cat.sayHello();
})()

// 20240406 p16 end